{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 准备数据集\n",
    "dataset_X=np.array([[0.3, 0.2], [0.1, 0.4], [0.4, 0.6], [0.9, 0.5]])\n",
    "dataset_y=np.array([0, 0, 0, 1])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 查看数据集的分布情况\n",
    "def visual_2D_dataset(dataset_X, dataset_y, title):\n",
    "    '''将二维数据集dataset_X和对应的类别dataset_y显示在散点图中'''\n",
    "    assert dataset_X.shape[1] == 2, 'only support dataset with 2 features'\n",
    "    classes = list(set(dataset_y))\n",
    "    markers = ['.', ',', 'o', 'v', '^', '<', '>', '1', '2', '3', '4', '8'\n",
    "        , 's', 'p', '*', 'h', 'H', '+', 'x', 'D', 'd', '|']\n",
    "    # colors=['b','c','g','k','m','w','r','y']\n",
    "    colors = ['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple',\n",
    "              'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan']\n",
    "    for class_id in classes:\n",
    "        one_class = np.array([feature for (feature, label) in\n",
    "                              zip(dataset_X, dataset_y) if label == class_id])\n",
    "        plt.scatter(one_class[:, 0], one_class[:, 1], marker=markers[class_id % len(markers)],\n",
    "                    c=colors[class_id % len(colors)], label='cls_' + str(class_id))\n",
    "    plt.title(title)\n",
    "    plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "visual_2D_dataset(dataset_X,dataset_y,\"simple dataset\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The goal of learning is reached\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5,1,'Training cost progress')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 建立感知器模型\n",
    "import neurolab as nl\n",
    "perceptron = nl.net.newp([[dataset_X[:,0].min(),dataset_X[:,0].max()], # 指定特征1的最小和最大值\n",
    "                          [dataset_X[:,1].min(),dataset_X[:,1].max()]], # 特征2的min和max\n",
    "                          1) # 只有1个感知器\n",
    "# 为了适合于train，需要将dataset_y处理成二维\n",
    "dataset_y=dataset_y[:,np.newaxis]\n",
    "cost=perceptron.train(dataset_X,dataset_y,epochs=50,show=10,lr=0.01) \n",
    "# 训练该单个感知器，50个回合，每10个回合显示一下训练结果，学习速率为0.01\n",
    "\n",
    "# 显示下训练过程中cost的变化趋势\n",
    "plt.plot(cost)\n",
    "plt.xlabel('Number of epochs')\n",
    "plt.ylabel('Training cost')\n",
    "plt.grid()\n",
    "plt.title('Training cost progress')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
